package com.sky.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.OperationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Knife4j 增强界面: http://localhost:8080/doc.html
 *
 * Swagger 原生界面: http://localhost:8080/swagger-ui.html
 *
 * OpenAPI JSON: http://localhost:8080/v3/api-docs
 *
 * 参考ds:https://chat.deepseek.com/a/chat/s/37dcd272-213d-45f1-8c2f-051eff38102b
 */
@Configuration
public class OpenApiConfig {
    
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("项目API文档")
                        .version("1.0")
                        .description("这是基于SpringDoc和Knife4j生成的详细API文档")
                        .contact(new Contact()
                                .name("技术支持")
                                .url("http://example.com")
                                .email("support@example.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("http://springdoc.org")));
    }

    /**
     * 分组1：用户相关接口
     * 配置后，你可以通过以下 URL 访问不同的文档：
     * http://localhost:8080/v3/api-docs/Users
     *
     * http://localhost:8080/v3/api-docs/Orders
     * Swagger UI 页面上会有一个下拉菜单让你选择不同的分组。
      */

    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("API配置管理员") // 分组名
                .pathsToMatch("/admin/employee/**","/admin/common/**") // 匹配路径
                .build();
    }

    // 分组2：订单相关接口
//    @Bean
//    public GroupedOpenApi orderApi() {
//        return GroupedOpenApi.builder()
//                .group("Orders")
//                .pathsToMatch("/api/orders/**")
//                .addOpenApiMethodFilter(method -> method.isAnnotationPresent(RequiresAdmin.class)) // 甚至可以按方法注解过滤
//                .build();
//    }

    // 分组3：公共接口（排除管理接口）可打开
//    @Bean
//    public GroupedOpenApi publicApi() {
//        return GroupedOpenApi.builder()
//                .group("Public")
//                .pathsToExclude("/api/admin/**")
//                .build();
//    }

    @Bean
    public OperationCustomizer customGlobalHeaders() {
        return (operation, handlerMethod) -> {
            // 可以在这里添加全局参数
            return operation;
        };
    }
}